/* * Copyright 2008 University of Prince Edward Island * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ca.upei.ic.timetable.client; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.Response; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONBoolean; import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; public class CourseViewController implements ViewController { private final Service service_; private ApplicationController app_; private CourseModelView view_; private Set<Integer> selectionIndexes_; private Map<Integer,JSONObject> selectionValues_; private Map<String,Boolean> levelCriteria_; private Map<String,Boolean> departmentCriteria_; private Map<String, Boolean> semesterCriteria_; private String courseDay_; private String courseStartTime_; public CourseViewController(ApplicationController app) { // initialization app_ = app; service_ = Service.defaultInstance(); view_ = new CourseModelView(this); // selection selectionIndexes_ = new TreeSet<Integer>(); selectionValues_ = new HashMap<Integer,JSONObject>(); // create the criteria hash maps levelCriteria_ = new HashMap<String,Boolean>(); departmentCriteria_ = new HashMap<String,Boolean>(); semesterCriteria_ = new HashMap<String,Boolean>(); } public CourseModelView getView() { return view_; } public void setLevelCriteria(String name, boolean included) { levelCriteria_.put(name, included); } public void setDepartmentCriteria(String name, boolean included) { departmentCriteria_.put(name, included); } public void setSemesterCriteria(String name, boolean included) { semesterCriteria_.put(name, included); } public void setCourseStartTimeCriteria(String day, String startTime) { courseDay_ = day; courseStartTime_ = startTime; } public void search() { JSONObject department = new JSONObject(); for (String d: departmentCriteria_.keySet()) { if (departmentCriteria_.get(d)) { department.put(d, JSONBoolean.getInstance(true)); } } JSONObject level = new JSONObject(); for (String l: levelCriteria_.keySet()) { if (levelCriteria_.get(l)) { level.put(l, JSONBoolean.getInstance(true)); } } JSONObject semester = new JSONObject(); for (String s: semesterCriteria_.keySet()) { if (semesterCriteria_.get(s)) semester.put(s, JSONBoolean.getInstance(true)); } JSONObject value = new JSONObject(); value.put("department", department); value.put("level", level); value.put("semester", semester); value.put("day", new JSONString(courseDay_)); value.put("startTime", new JSONString(courseStartTime_)); Service.defaultInstance().askCourses(value.toString(), new RequestCallback() { public void onError(Request request, Throwable exception) { app_.error(ApplicationController.OOPS, exception); } public void onResponseReceived(Request request, Response response) { try { JSONArray parsedArray = (JSONArray) JSONParser.parse(response.getText()); // remove the selected courses // filtered array JSONArray filteredArray = new JSONArray(); int filtered_index = 0; for (int i=0; i<parsedArray.size(); i++) { JSONObject o = (JSONObject) parsedArray.get(i); int id = (int) ((JSONNumber) o.get("id")).doubleValue(); if (!isSelected(id)) { filteredArray.set(filtered_index++, o); } } // clear out the view so we can add courses view_.clear(); // add the selected values first for (int index: selectionIndexes_) { view_.addCourse(index, selectionValues_.get(index), true); } // add the remaining courses view_.loadJSON(filteredArray); } catch (Throwable e) { app_.error("Error: " + response.getText(), e); } } }); } public void select(int index, JSONObject value) { selectionIndexes_.add(index); selectionValues_.put(index, value); app_.getCourseCalendarController().addCourse(index, value); } public void unselect(int index) { selectionIndexes_.remove(index); selectionValues_.remove(index); app_.getCourseCalendarController().removeCourse(index); } public boolean isSelected(int index) { return selectionIndexes_.contains(index); } public void showCourseDetail(int id) { app_.getCourseDetailController().showCourseDetail(id); } public void hideCourseDetail() { app_.getCourseDetailController().hideCourseDetail(); } /** * Clear all courses in the view */ public void clear() { // clear all courses in the view view_.clear(); // unselect all courses while (selectionIndexes_.iterator().hasNext()) { int index = selectionIndexes_.iterator().next(); unselect(index); } } }